module CRC16_128B_TX (
			rst,   	
			clk,   			
   			dval, 
   			sop,
   			eop,
   			eop_dmod,	 
   			data,  
   			
   			crc16_rdy,
            crc16
			);
			
input			rst;
input			clk;
input			dval;
input           sop; 			    
input           eop;
input	[4:0]	eop_dmod;
input  	[127:0]	data;

output			crc16_rdy;
output 	[15:0]	crc16;

reg 			crc16_rdy;
wire  	[15:0]	crc16;
	

////////////////////////////////////////
//////int reg//////////////////////////
///////////////////////////////////////
reg		[4:0]	eop_dmod_d1; 
reg		[4:0]	eop_dmod_d2; 
reg		[4:0]	eop_dmod_d3; 
reg		[4:0]	eop_dmod_d4;
reg		[4:0]	eop_dmod_d5;
reg				dval_d1;
reg             dval_d2;    

   
wire	[127:0]	data_valid;
reg		[127:0]	data_valid_d1;
reg		[127:0]	data_valid_d2;
reg		[127:0]	data_valid_d3;

reg             sop_d1;
reg				eop_d1;
reg				eop_d2;
reg				eop_d3;  
reg				eop_d4;
reg				eop_d5;

////////////////////////////
reg     [15:0]  crc16_d128_d1;
reg     [15:0]  crc16_d128_d2;
reg     [15:0]  crc16_d128_d3;  
reg     [15:0]  crc16_d128_d4;

reg     [15:0]  crc16_d64_d1;
reg     [15:0]  crc16_d64_d2;
reg     [15:0]  crc16_d64_d3;

reg     [15:0]  crc16_d32_d1;
reg     [15:0]  crc16_d32_d2;

reg     [15:0]  crc16_d16_d1; 

reg     [15:0]  crc16_d128;
reg     [15:0]  crc16_d64;
reg     [15:0]  crc16_d32;
reg     [15:0]  crc16_d16;
reg     [15:0]  crc16_d8;  

reg     [15:0]  crc16_b1;

/////////////////////////////////////////////////////////
always @(posedge rst or posedge clk)
begin 
	if (rst == 1'b1)
	begin  
	    dval_d1     <= 1'b0;
	    dval_d2     <= 1'b0;
	    sop_d1      <= 1'b0;
	    eop_d1      <= 1'b0; 
	    eop_d2      <= 1'b0; 
	    eop_d3      <= 1'b0; 
	    eop_d4      <= 1'b0; 
	    eop_d5      <= 1'b0;
	    eop_dmod_d1 <= 5'h00;
	    eop_dmod_d2 <= 5'h00;    
	    eop_dmod_d3 <= 5'h00;
	    eop_dmod_d4 <= 5'h00;
	    eop_dmod_d5 <= 5'h00;	    
	end
	else
	begin
	    dval_d1     <= dval;
	    dval_d2     <= dval_d1;
	    sop_d1      <= sop;
	    eop_d1      <= eop; 
	    eop_d2      <= eop_d1; 
	    eop_d3      <= eop_d2; 
	    eop_d4      <= eop_d3;
	    eop_d5      <= eop_d4;
	    eop_dmod_d1 <= eop_dmod;
	    eop_dmod_d2 <= eop_dmod_d1;
	    eop_dmod_d3 <= eop_dmod_d2;
	    eop_dmod_d4 <= eop_dmod_d3;
	    eop_dmod_d5 <= eop_dmod_d4;
	end
end	

always @(posedge rst or posedge clk)
begin 
	if (rst == 1'b1)
    begin
//		data_valid   <= 128'd0; 
		data_valid_d1<= 128'd0;
		data_valid_d2<= 128'd0;
		data_valid_d3<= 128'd0;
	end	
	else
	begin 
//      data_valid   <= data;
        data_valid_d1<= data_valid   ;
		data_valid_d2<= data_valid_d1;
		data_valid_d3<= data_valid_d2;
    end           
end	 

assign data_valid = data; 

always @(posedge rst or posedge clk)
begin 
	if (rst == 1'b1)
    begin
        crc16_d128_d1 <= 16'h0000;
        crc16_d128_d2 <= 16'h0000;
        crc16_d128_d3 <= 16'h0000;
        crc16_d128_d4 <= 16'h0000;
    end
    else
    begin
        crc16_d128_d1 <= crc16_d128;
        crc16_d128_d2 <= crc16_d128_d1;
        crc16_d128_d3 <= crc16_d128_d2;
        crc16_d128_d4 <= crc16_d128_d3;    
    end
end     

always @(posedge rst or posedge clk)
begin 
	if (rst == 1'b1)
    begin
        crc16_d64_d1 <= 16'h0000;
        crc16_d64_d2 <= 16'h0000;
        crc16_d64_d3 <= 16'h0000;
    end
    else
    begin
        crc16_d64_d1 <= crc16_d64;
        crc16_d64_d2 <= crc16_d64_d1;
        crc16_d64_d3 <= crc16_d64_d2; 
    end
end     

always @(posedge rst or posedge clk)
begin 
	if (rst == 1'b1)
    begin
        crc16_d32_d1 <= 16'h0000;
        crc16_d32_d2 <= 16'h0000;
    end
    else
    begin
        crc16_d32_d1 <= crc16_d32;
        crc16_d32_d2 <= crc16_d32_d1;
    end
end     

always @(posedge rst or posedge clk)
begin 
	if (rst == 1'b1)
        crc16_d16_d1 <= 16'h0000;  
    else
        crc16_d16_d1 <= crc16_d16;
end      

always @(posedge rst or posedge clk)
begin 
	if (rst == 1'b1)	
	    crc16_d128 <= 16'hFFFF;
    else if (sop)
        crc16_d128 <= CRC16_D128(data_valid,16'hFFFF);
    else if (dval)
        crc16_d128 <= CRC16_D128(data_valid,crc16_d128);
    else
        crc16_d128 <= 16'hFFFF;   
end       

always @(posedge rst or posedge clk)
begin 
	if (rst == 1'b1)	
	    crc16_d64 <= 16'hFFFF;
    else if (dval)           
        crc16_d64 <= CRC16_D64(data_valid[127:64],crc16_d128);
    else
        crc16_d64 <= 16'hFFFF;    
end    

always @(posedge rst or posedge clk)
begin 
	if (rst == 1'b1)	
	    crc16_d32 <= 16'hFFFF;
    else if (eop_d1 & eop_dmod_d1[2])
        if (eop_dmod_d1[3])
            crc16_d32 <= CRC16_D32(data_valid_d1[63:32],crc16_d64); 
        else
            crc16_d32 <= CRC16_D32(data_valid_d1[127:96],crc16_d128_d1); 
    else
        crc16_d32 <= 16'hFFFF;         
                   
end    

always @(posedge rst or posedge clk)
begin 
	if (rst == 1'b1)	
	    crc16_d16 <= 16'hFFFF;
    else if (eop_d2 & eop_dmod_d2[1])
        case (eop_dmod_d2[3:2])
            2'b11 : crc16_d16 <= CRC16_D16(data_valid_d2[32:16],crc16_d32); 
            2'b10 : crc16_d16 <= CRC16_D16(data_valid_d2[63:48],crc16_d64_d1); 
            2'b01 : crc16_d16 <= CRC16_D16(data_valid_d2[95:80],crc16_d32); 
            2'b00 : crc16_d16 <= CRC16_D16(data_valid_d2[127:112],crc16_d128_d2); 
          default : crc16_d16 <= 16'hFFFF;   
        endcase   
    else
        crc16_d16 <= 16'hFFFF;                
end    

always @(posedge rst or posedge clk)
begin 
	if (rst == 1'b1)	
	    crc16_d8 <= 16'hFFFF;
    else if (eop_d3 & (eop_dmod_d3[0]))
        case (eop_dmod_d3[3:1])
            3'b111 : crc16_d8 <= CRC16_D8(data_valid_d3[15:8],crc16_d16);   
            3'b110 : crc16_d8 <= CRC16_D8(data_valid_d3[31:24],crc16_d32_d1);  
            3'b101 : crc16_d8 <= CRC16_D8(data_valid_d3[47:40],crc16_d16);  
            3'b100 : crc16_d8 <= CRC16_D8(data_valid_d3[63:56],crc16_d64_d2);  
            3'b011 : crc16_d8 <= CRC16_D8(data_valid_d3[79:72],crc16_d16);  
            3'b010 : crc16_d8 <= CRC16_D8(data_valid_d3[95:88],crc16_d32_d1);  
            3'b001 : crc16_d8 <= CRC16_D8(data_valid_d3[111:104],crc16_d16);
            3'b000 : crc16_d8 <= CRC16_D8(data_valid_d3[127:120],crc16_d128_d3);   
            default: crc16_d8 <= 16'hFFFF; 
        endcase
    else
        crc16_d8 <= 16'hFFFF;             
end 
/*
always @(posedge rst or posedge clk)
begin 
	if (rst == 1'b1)
	    crc16_b1 <= 16'h0000;
	else if (eop_d4) 
	    case (eop_dmod_d4) 
	        5'h01 : crc16_b1 <= crc16_d8;
	        5'h02 : crc16_b1 <= crc16_d16_d1;
	        5'h03 : crc16_b1 <= crc16_d8;
	        5'h04 : crc16_b1 <= crc16_d32_d2;
	        5'h05 : crc16_b1 <= crc16_d8;
	        5'h06 : crc16_b1 <= crc16_d16_d1;
	        5'h07 : crc16_b1 <= crc16_d8;
	        5'h08 : crc16_b1 <= crc16_d64_d3;
	        5'h09 : crc16_b1 <= crc16_d8;
	        5'h0A : crc16_b1 <= crc16_d16_d1;
	        5'h0B : crc16_b1 <= crc16_d8;
	        5'h0C : crc16_b1 <= crc16_d32_d2;
	        5'h0D : crc16_b1 <= crc16_d8;
	        5'h0E : crc16_b1 <= crc16_d16_d1;
	        5'h0F : crc16_b1 <= crc16_d8;    
	        5'h10 : crc16_b1 <= crc16_d128_d3;   
	      default : crc16_b1 <= 16'h0000;        
	    endcase      
end
*/

always @(*)
begin 
    if (eop_d4) 
	    case (eop_dmod_d4) 
	        5'h01 : crc16_b1 = crc16_d8;
	        5'h02 : crc16_b1 = crc16_d16_d1;
	        5'h03 : crc16_b1 = crc16_d8;
	        5'h04 : crc16_b1 = crc16_d32_d2;
	        5'h05 : crc16_b1 = crc16_d8;
	        5'h06 : crc16_b1 = crc16_d16_d1;
	        5'h07 : crc16_b1 = crc16_d8;
	        5'h08 : crc16_b1 = crc16_d64_d3;
	        5'h09 : crc16_b1 = crc16_d8;
	        5'h0A : crc16_b1 = crc16_d16_d1;
	        5'h0B : crc16_b1 = crc16_d8;
	        5'h0C : crc16_b1 = crc16_d32_d2;
	        5'h0D : crc16_b1 = crc16_d8;
	        5'h0E : crc16_b1 = crc16_d16_d1;
	        5'h0F : crc16_b1 = crc16_d8;    
	        5'h10 : crc16_b1 = crc16_d128_d3;   
	      default : crc16_b1 = 16'h0000;        
	    endcase      
end

always @(posedge rst or posedge clk)
begin 
	if (rst == 1'b1)
        crc16_rdy <= 1'b0;
    else
        crc16_rdy <= eop_d3;
end
   
assign crc16 =~{ 
               crc16_b1[8] ,crc16_b1[9] ,crc16_b1[10],crc16_b1[11],crc16_b1[12],crc16_b1[13],crc16_b1[14],crc16_b1[15], 
               crc16_b1[0] ,crc16_b1[1] ,crc16_b1[2], crc16_b1[3] ,crc16_b1[4] ,crc16_b1[5] ,crc16_b1[6] ,crc16_b1[7] 
               };                  

/////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////                      CRC Function                     ///////////////////////////////////
function [15:0] CRC16_D128;

  input [127:0] Data;
  input [15:0] crc;
  reg [127:0] d;
  reg [15:0] c;
  reg [15:0] newcrc;
begin
  d = Data;
  c = crc;

  newcrc[0] = d[127] ^ d[123] ^ d[121] ^ d[118] ^ d[115] ^ d[113] ^ d[110] ^ d[109] ^ d[108] ^ d[107] ^ d[106] ^ d[104] ^ d[98] ^ d[96] ^ d[95] ^ d[88] ^ d[86] ^ d[84] ^ d[82] ^ d[81] ^ d[80] ^ d[77] ^ d[75] ^ d[74] ^ d[72] ^ d[70] ^ d[67] ^ d[66] ^ d[65] ^ d[64] ^ d[63] ^ d[58] ^ d[56] ^ d[55] ^ d[52] ^ d[51] ^ d[49] ^ d[48] ^ d[42] ^ d[35] ^ d[33] ^ d[32] ^ d[28] ^ d[27] ^ d[26] ^ d[22] ^ d[20] ^ d[19] ^ d[12] ^ d[11] ^ d[8] ^ d[4] ^ d[0] ^ c[1] ^ c[3] ^ c[6] ^ c[9] ^ c[11] ^ c[15];
  newcrc[1] = d[124] ^ d[122] ^ d[119] ^ d[116] ^ d[114] ^ d[111] ^ d[110] ^ d[109] ^ d[108] ^ d[107] ^ d[105] ^ d[99] ^ d[97] ^ d[96] ^ d[89] ^ d[87] ^ d[85] ^ d[83] ^ d[82] ^ d[81] ^ d[78] ^ d[76] ^ d[75] ^ d[73] ^ d[71] ^ d[68] ^ d[67] ^ d[66] ^ d[65] ^ d[64] ^ d[59] ^ d[57] ^ d[56] ^ d[53] ^ d[52] ^ d[50] ^ d[49] ^ d[43] ^ d[36] ^ d[34] ^ d[33] ^ d[29] ^ d[28] ^ d[27] ^ d[23] ^ d[21] ^ d[20] ^ d[13] ^ d[12] ^ d[9] ^ d[5] ^ d[1] ^ c[2] ^ c[4] ^ c[7] ^ c[10] ^ c[12];
  newcrc[2] = d[125] ^ d[123] ^ d[120] ^ d[117] ^ d[115] ^ d[112] ^ d[111] ^ d[110] ^ d[109] ^ d[108] ^ d[106] ^ d[100] ^ d[98] ^ d[97] ^ d[90] ^ d[88] ^ d[86] ^ d[84] ^ d[83] ^ d[82] ^ d[79] ^ d[77] ^ d[76] ^ d[74] ^ d[72] ^ d[69] ^ d[68] ^ d[67] ^ d[66] ^ d[65] ^ d[60] ^ d[58] ^ d[57] ^ d[54] ^ d[53] ^ d[51] ^ d[50] ^ d[44] ^ d[37] ^ d[35] ^ d[34] ^ d[30] ^ d[29] ^ d[28] ^ d[24] ^ d[22] ^ d[21] ^ d[14] ^ d[13] ^ d[10] ^ d[6] ^ d[2] ^ c[0] ^ c[3] ^ c[5] ^ c[8] ^ c[11] ^ c[13];
  newcrc[3] = d[126] ^ d[124] ^ d[121] ^ d[118] ^ d[116] ^ d[113] ^ d[112] ^ d[111] ^ d[110] ^ d[109] ^ d[107] ^ d[101] ^ d[99] ^ d[98] ^ d[91] ^ d[89] ^ d[87] ^ d[85] ^ d[84] ^ d[83] ^ d[80] ^ d[78] ^ d[77] ^ d[75] ^ d[73] ^ d[70] ^ d[69] ^ d[68] ^ d[67] ^ d[66] ^ d[61] ^ d[59] ^ d[58] ^ d[55] ^ d[54] ^ d[52] ^ d[51] ^ d[45] ^ d[38] ^ d[36] ^ d[35] ^ d[31] ^ d[30] ^ d[29] ^ d[25] ^ d[23] ^ d[22] ^ d[15] ^ d[14] ^ d[11] ^ d[7] ^ d[3] ^ c[0] ^ c[1] ^ c[4] ^ c[6] ^ c[9] ^ c[12] ^ c[14];
  newcrc[4] = d[127] ^ d[125] ^ d[122] ^ d[119] ^ d[117] ^ d[114] ^ d[113] ^ d[112] ^ d[111] ^ d[110] ^ d[108] ^ d[102] ^ d[100] ^ d[99] ^ d[92] ^ d[90] ^ d[88] ^ d[86] ^ d[85] ^ d[84] ^ d[81] ^ d[79] ^ d[78] ^ d[76] ^ d[74] ^ d[71] ^ d[70] ^ d[69] ^ d[68] ^ d[67] ^ d[62] ^ d[60] ^ d[59] ^ d[56] ^ d[55] ^ d[53] ^ d[52] ^ d[46] ^ d[39] ^ d[37] ^ d[36] ^ d[32] ^ d[31] ^ d[30] ^ d[26] ^ d[24] ^ d[23] ^ d[16] ^ d[15] ^ d[12] ^ d[8] ^ d[4] ^ c[0] ^ c[1] ^ c[2] ^ c[5] ^ c[7] ^ c[10] ^ c[13] ^ c[15];
  newcrc[5] = d[127] ^ d[126] ^ d[121] ^ d[120] ^ d[114] ^ d[112] ^ d[111] ^ d[110] ^ d[108] ^ d[107] ^ d[106] ^ d[104] ^ d[103] ^ d[101] ^ d[100] ^ d[98] ^ d[96] ^ d[95] ^ d[93] ^ d[91] ^ d[89] ^ d[88] ^ d[87] ^ d[85] ^ d[84] ^ d[81] ^ d[79] ^ d[74] ^ d[71] ^ d[69] ^ d[68] ^ d[67] ^ d[66] ^ d[65] ^ d[64] ^ d[61] ^ d[60] ^ d[58] ^ d[57] ^ d[55] ^ d[54] ^ d[53] ^ d[52] ^ d[51] ^ d[49] ^ d[48] ^ d[47] ^ d[42] ^ d[40] ^ d[38] ^ d[37] ^ d[35] ^ d[31] ^ d[28] ^ d[26] ^ d[25] ^ d[24] ^ d[22] ^ d[20] ^ d[19] ^ d[17] ^ d[16] ^ d[13] ^ d[12] ^ d[11] ^ d[9] ^ d[8] ^ d[5] ^ d[4] ^ d[0] ^ c[0] ^ c[2] ^ c[8] ^ c[9] ^ c[14] ^ c[15];
  newcrc[6] = d[127] ^ d[122] ^ d[121] ^ d[115] ^ d[113] ^ d[112] ^ d[111] ^ d[109] ^ d[108] ^ d[107] ^ d[105] ^ d[104] ^ d[102] ^ d[101] ^ d[99] ^ d[97] ^ d[96] ^ d[94] ^ d[92] ^ d[90] ^ d[89] ^ d[88] ^ d[86] ^ d[85] ^ d[82] ^ d[80] ^ d[75] ^ d[72] ^ d[70] ^ d[69] ^ d[68] ^ d[67] ^ d[66] ^ d[65] ^ d[62] ^ d[61] ^ d[59] ^ d[58] ^ d[56] ^ d[55] ^ d[54] ^ d[53] ^ d[52] ^ d[50] ^ d[49] ^ d[48] ^ d[43] ^ d[41] ^ d[39] ^ d[38] ^ d[36] ^ d[32] ^ d[29] ^ d[27] ^ d[26] ^ d[25] ^ d[23] ^ d[21] ^ d[20] ^ d[18] ^ d[17] ^ d[14] ^ d[13] ^ d[12] ^ d[10] ^ d[9] ^ d[6] ^ d[5] ^ d[1] ^ c[0] ^ c[1] ^ c[3] ^ c[9] ^ c[10] ^ c[15];
  newcrc[7] = d[123] ^ d[122] ^ d[116] ^ d[114] ^ d[113] ^ d[112] ^ d[110] ^ d[109] ^ d[108] ^ d[106] ^ d[105] ^ d[103] ^ d[102] ^ d[100] ^ d[98] ^ d[97] ^ d[95] ^ d[93] ^ d[91] ^ d[90] ^ d[89] ^ d[87] ^ d[86] ^ d[83] ^ d[81] ^ d[76] ^ d[73] ^ d[71] ^ d[70] ^ d[69] ^ d[68] ^ d[67] ^ d[66] ^ d[63] ^ d[62] ^ d[60] ^ d[59] ^ d[57] ^ d[56] ^ d[55] ^ d[54] ^ d[53] ^ d[51] ^ d[50] ^ d[49] ^ d[44] ^ d[42] ^ d[40] ^ d[39] ^ d[37] ^ d[33] ^ d[30] ^ d[28] ^ d[27] ^ d[26] ^ d[24] ^ d[22] ^ d[21] ^ d[19] ^ d[18] ^ d[15] ^ d[14] ^ d[13] ^ d[11] ^ d[10] ^ d[7] ^ d[6] ^ d[2] ^ c[0] ^ c[1] ^ c[2] ^ c[4] ^ c[10] ^ c[11];
  newcrc[8] = d[124] ^ d[123] ^ d[117] ^ d[115] ^ d[114] ^ d[113] ^ d[111] ^ d[110] ^ d[109] ^ d[107] ^ d[106] ^ d[104] ^ d[103] ^ d[101] ^ d[99] ^ d[98] ^ d[96] ^ d[94] ^ d[92] ^ d[91] ^ d[90] ^ d[88] ^ d[87] ^ d[84] ^ d[82] ^ d[77] ^ d[74] ^ d[72] ^ d[71] ^ d[70] ^ d[69] ^ d[68] ^ d[67] ^ d[64] ^ d[63] ^ d[61] ^ d[60] ^ d[58] ^ d[57] ^ d[56] ^ d[55] ^ d[54] ^ d[52] ^ d[51] ^ d[50] ^ d[45] ^ d[43] ^ d[41] ^ d[40] ^ d[38] ^ d[34] ^ d[31] ^ d[29] ^ d[28] ^ d[27] ^ d[25] ^ d[23] ^ d[22] ^ d[20] ^ d[19] ^ d[16] ^ d[15] ^ d[14] ^ d[12] ^ d[11] ^ d[8] ^ d[7] ^ d[3] ^ c[1] ^ c[2] ^ c[3] ^ c[5] ^ c[11] ^ c[12];
  newcrc[9] = d[125] ^ d[124] ^ d[118] ^ d[116] ^ d[115] ^ d[114] ^ d[112] ^ d[111] ^ d[110] ^ d[108] ^ d[107] ^ d[105] ^ d[104] ^ d[102] ^ d[100] ^ d[99] ^ d[97] ^ d[95] ^ d[93] ^ d[92] ^ d[91] ^ d[89] ^ d[88] ^ d[85] ^ d[83] ^ d[78] ^ d[75] ^ d[73] ^ d[72] ^ d[71] ^ d[70] ^ d[69] ^ d[68] ^ d[65] ^ d[64] ^ d[62] ^ d[61] ^ d[59] ^ d[58] ^ d[57] ^ d[56] ^ d[55] ^ d[53] ^ d[52] ^ d[51] ^ d[46] ^ d[44] ^ d[42] ^ d[41] ^ d[39] ^ d[35] ^ d[32] ^ d[30] ^ d[29] ^ d[28] ^ d[26] ^ d[24] ^ d[23] ^ d[21] ^ d[20] ^ d[17] ^ d[16] ^ d[15] ^ d[13] ^ d[12] ^ d[9] ^ d[8] ^ d[4] ^ c[0] ^ c[2] ^ c[3] ^ c[4] ^ c[6] ^ c[12] ^ c[13];
  newcrc[10] = d[126] ^ d[125] ^ d[119] ^ d[117] ^ d[116] ^ d[115] ^ d[113] ^ d[112] ^ d[111] ^ d[109] ^ d[108] ^ d[106] ^ d[105] ^ d[103] ^ d[101] ^ d[100] ^ d[98] ^ d[96] ^ d[94] ^ d[93] ^ d[92] ^ d[90] ^ d[89] ^ d[86] ^ d[84] ^ d[79] ^ d[76] ^ d[74] ^ d[73] ^ d[72] ^ d[71] ^ d[70] ^ d[69] ^ d[66] ^ d[65] ^ d[63] ^ d[62] ^ d[60] ^ d[59] ^ d[58] ^ d[57] ^ d[56] ^ d[54] ^ d[53] ^ d[52] ^ d[47] ^ d[45] ^ d[43] ^ d[42] ^ d[40] ^ d[36] ^ d[33] ^ d[31] ^ d[30] ^ d[29] ^ d[27] ^ d[25] ^ d[24] ^ d[22] ^ d[21] ^ d[18] ^ d[17] ^ d[16] ^ d[14] ^ d[13] ^ d[10] ^ d[9] ^ d[5] ^ c[0] ^ c[1] ^ c[3] ^ c[4] ^ c[5] ^ c[7] ^ c[13] ^ c[14];
  newcrc[11] = d[127] ^ d[126] ^ d[120] ^ d[118] ^ d[117] ^ d[116] ^ d[114] ^ d[113] ^ d[112] ^ d[110] ^ d[109] ^ d[107] ^ d[106] ^ d[104] ^ d[102] ^ d[101] ^ d[99] ^ d[97] ^ d[95] ^ d[94] ^ d[93] ^ d[91] ^ d[90] ^ d[87] ^ d[85] ^ d[80] ^ d[77] ^ d[75] ^ d[74] ^ d[73] ^ d[72] ^ d[71] ^ d[70] ^ d[67] ^ d[66] ^ d[64] ^ d[63] ^ d[61] ^ d[60] ^ d[59] ^ d[58] ^ d[57] ^ d[55] ^ d[54] ^ d[53] ^ d[48] ^ d[46] ^ d[44] ^ d[43] ^ d[41] ^ d[37] ^ d[34] ^ d[32] ^ d[31] ^ d[30] ^ d[28] ^ d[26] ^ d[25] ^ d[23] ^ d[22] ^ d[19] ^ d[18] ^ d[17] ^ d[15] ^ d[14] ^ d[11] ^ d[10] ^ d[6] ^ c[0] ^ c[1] ^ c[2] ^ c[4] ^ c[5] ^ c[6] ^ c[8] ^ c[14] ^ c[15];
  newcrc[12] = d[123] ^ d[119] ^ d[117] ^ d[114] ^ d[111] ^ d[109] ^ d[106] ^ d[105] ^ d[104] ^ d[103] ^ d[102] ^ d[100] ^ d[94] ^ d[92] ^ d[91] ^ d[84] ^ d[82] ^ d[80] ^ d[78] ^ d[77] ^ d[76] ^ d[73] ^ d[71] ^ d[70] ^ d[68] ^ d[66] ^ d[63] ^ d[62] ^ d[61] ^ d[60] ^ d[59] ^ d[54] ^ d[52] ^ d[51] ^ d[48] ^ d[47] ^ d[45] ^ d[44] ^ d[38] ^ d[31] ^ d[29] ^ d[28] ^ d[24] ^ d[23] ^ d[22] ^ d[18] ^ d[16] ^ d[15] ^ d[8] ^ d[7] ^ d[4] ^ d[0] ^ c[2] ^ c[5] ^ c[7] ^ c[11];
  newcrc[13] = d[124] ^ d[120] ^ d[118] ^ d[115] ^ d[112] ^ d[110] ^ d[107] ^ d[106] ^ d[105] ^ d[104] ^ d[103] ^ d[101] ^ d[95] ^ d[93] ^ d[92] ^ d[85] ^ d[83] ^ d[81] ^ d[79] ^ d[78] ^ d[77] ^ d[74] ^ d[72] ^ d[71] ^ d[69] ^ d[67] ^ d[64] ^ d[63] ^ d[62] ^ d[61] ^ d[60] ^ d[55] ^ d[53] ^ d[52] ^ d[49] ^ d[48] ^ d[46] ^ d[45] ^ d[39] ^ d[32] ^ d[30] ^ d[29] ^ d[25] ^ d[24] ^ d[23] ^ d[19] ^ d[17] ^ d[16] ^ d[9] ^ d[8] ^ d[5] ^ d[1] ^ c[0] ^ c[3] ^ c[6] ^ c[8] ^ c[12];
  newcrc[14] = d[125] ^ d[121] ^ d[119] ^ d[116] ^ d[113] ^ d[111] ^ d[108] ^ d[107] ^ d[106] ^ d[105] ^ d[104] ^ d[102] ^ d[96] ^ d[94] ^ d[93] ^ d[86] ^ d[84] ^ d[82] ^ d[80] ^ d[79] ^ d[78] ^ d[75] ^ d[73] ^ d[72] ^ d[70] ^ d[68] ^ d[65] ^ d[64] ^ d[63] ^ d[62] ^ d[61] ^ d[56] ^ d[54] ^ d[53] ^ d[50] ^ d[49] ^ d[47] ^ d[46] ^ d[40] ^ d[33] ^ d[31] ^ d[30] ^ d[26] ^ d[25] ^ d[24] ^ d[20] ^ d[18] ^ d[17] ^ d[10] ^ d[9] ^ d[6] ^ d[2] ^ c[1] ^ c[4] ^ c[7] ^ c[9] ^ c[13];
  newcrc[15] = d[126] ^ d[122] ^ d[120] ^ d[117] ^ d[114] ^ d[112] ^ d[109] ^ d[108] ^ d[107] ^ d[106] ^ d[105] ^ d[103] ^ d[97] ^ d[95] ^ d[94] ^ d[87] ^ d[85] ^ d[83] ^ d[81] ^ d[80] ^ d[79] ^ d[76] ^ d[74] ^ d[73] ^ d[71] ^ d[69] ^ d[66] ^ d[65] ^ d[64] ^ d[63] ^ d[62] ^ d[57] ^ d[55] ^ d[54] ^ d[51] ^ d[50] ^ d[48] ^ d[47] ^ d[41] ^ d[34] ^ d[32] ^ d[31] ^ d[27] ^ d[26] ^ d[25] ^ d[21] ^ d[19] ^ d[18] ^ d[11] ^ d[10] ^ d[7] ^ d[3] ^ c[0] ^ c[2] ^ c[5] ^ c[8] ^ c[10] ^ c[14];
  CRC16_D128 = newcrc;
end
endfunction

function [15:0] CRC16_D64;

  input [63:0] Data;
  input [15:0] crc;
  reg [63:0] d;
  reg [15:0] c;
  reg [15:0] newcrc;
begin
  d = Data;
  c = crc;

  newcrc[0] = d[63] ^ d[58] ^ d[56] ^ d[55] ^ d[52] ^ d[51] ^ d[49] ^ d[48] ^ d[42] ^ d[35] ^ d[33] ^ d[32] ^ d[28] ^ d[27] ^ d[26] ^ d[22] ^ d[20] ^ d[19] ^ d[12] ^ d[11] ^ d[8] ^ d[4] ^ d[0] ^ c[0] ^ c[1] ^ c[3] ^ c[4] ^ c[7] ^ c[8] ^ c[10] ^ c[15];
  newcrc[1] = d[59] ^ d[57] ^ d[56] ^ d[53] ^ d[52] ^ d[50] ^ d[49] ^ d[43] ^ d[36] ^ d[34] ^ d[33] ^ d[29] ^ d[28] ^ d[27] ^ d[23] ^ d[21] ^ d[20] ^ d[13] ^ d[12] ^ d[9] ^ d[5] ^ d[1] ^ c[1] ^ c[2] ^ c[4] ^ c[5] ^ c[8] ^ c[9] ^ c[11];
  newcrc[2] = d[60] ^ d[58] ^ d[57] ^ d[54] ^ d[53] ^ d[51] ^ d[50] ^ d[44] ^ d[37] ^ d[35] ^ d[34] ^ d[30] ^ d[29] ^ d[28] ^ d[24] ^ d[22] ^ d[21] ^ d[14] ^ d[13] ^ d[10] ^ d[6] ^ d[2] ^ c[2] ^ c[3] ^ c[5] ^ c[6] ^ c[9] ^ c[10] ^ c[12];
  newcrc[3] = d[61] ^ d[59] ^ d[58] ^ d[55] ^ d[54] ^ d[52] ^ d[51] ^ d[45] ^ d[38] ^ d[36] ^ d[35] ^ d[31] ^ d[30] ^ d[29] ^ d[25] ^ d[23] ^ d[22] ^ d[15] ^ d[14] ^ d[11] ^ d[7] ^ d[3] ^ c[3] ^ c[4] ^ c[6] ^ c[7] ^ c[10] ^ c[11] ^ c[13];
  newcrc[4] = d[62] ^ d[60] ^ d[59] ^ d[56] ^ d[55] ^ d[53] ^ d[52] ^ d[46] ^ d[39] ^ d[37] ^ d[36] ^ d[32] ^ d[31] ^ d[30] ^ d[26] ^ d[24] ^ d[23] ^ d[16] ^ d[15] ^ d[12] ^ d[8] ^ d[4] ^ c[4] ^ c[5] ^ c[7] ^ c[8] ^ c[11] ^ c[12] ^ c[14];
  newcrc[5] = d[61] ^ d[60] ^ d[58] ^ d[57] ^ d[55] ^ d[54] ^ d[53] ^ d[52] ^ d[51] ^ d[49] ^ d[48] ^ d[47] ^ d[42] ^ d[40] ^ d[38] ^ d[37] ^ d[35] ^ d[31] ^ d[28] ^ d[26] ^ d[25] ^ d[24] ^ d[22] ^ d[20] ^ d[19] ^ d[17] ^ d[16] ^ d[13] ^ d[12] ^ d[11] ^ d[9] ^ d[8] ^ d[5] ^ d[4] ^ d[0] ^ c[0] ^ c[1] ^ c[3] ^ c[4] ^ c[5] ^ c[6] ^ c[7] ^ c[9] ^ c[10] ^ c[12] ^ c[13];
  newcrc[6] = d[62] ^ d[61] ^ d[59] ^ d[58] ^ d[56] ^ d[55] ^ d[54] ^ d[53] ^ d[52] ^ d[50] ^ d[49] ^ d[48] ^ d[43] ^ d[41] ^ d[39] ^ d[38] ^ d[36] ^ d[32] ^ d[29] ^ d[27] ^ d[26] ^ d[25] ^ d[23] ^ d[21] ^ d[20] ^ d[18] ^ d[17] ^ d[14] ^ d[13] ^ d[12] ^ d[10] ^ d[9] ^ d[6] ^ d[5] ^ d[1] ^ c[0] ^ c[1] ^ c[2] ^ c[4] ^ c[5] ^ c[6] ^ c[7] ^ c[8] ^ c[10] ^ c[11] ^ c[13] ^ c[14];
  newcrc[7] = d[63] ^ d[62] ^ d[60] ^ d[59] ^ d[57] ^ d[56] ^ d[55] ^ d[54] ^ d[53] ^ d[51] ^ d[50] ^ d[49] ^ d[44] ^ d[42] ^ d[40] ^ d[39] ^ d[37] ^ d[33] ^ d[30] ^ d[28] ^ d[27] ^ d[26] ^ d[24] ^ d[22] ^ d[21] ^ d[19] ^ d[18] ^ d[15] ^ d[14] ^ d[13] ^ d[11] ^ d[10] ^ d[7] ^ d[6] ^ d[2] ^ c[1] ^ c[2] ^ c[3] ^ c[5] ^ c[6] ^ c[7] ^ c[8] ^ c[9] ^ c[11] ^ c[12] ^ c[14] ^ c[15];
  newcrc[8] = d[63] ^ d[61] ^ d[60] ^ d[58] ^ d[57] ^ d[56] ^ d[55] ^ d[54] ^ d[52] ^ d[51] ^ d[50] ^ d[45] ^ d[43] ^ d[41] ^ d[40] ^ d[38] ^ d[34] ^ d[31] ^ d[29] ^ d[28] ^ d[27] ^ d[25] ^ d[23] ^ d[22] ^ d[20] ^ d[19] ^ d[16] ^ d[15] ^ d[14] ^ d[12] ^ d[11] ^ d[8] ^ d[7] ^ d[3] ^ c[2] ^ c[3] ^ c[4] ^ c[6] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[12] ^ c[13] ^ c[15];
  newcrc[9] = d[62] ^ d[61] ^ d[59] ^ d[58] ^ d[57] ^ d[56] ^ d[55] ^ d[53] ^ d[52] ^ d[51] ^ d[46] ^ d[44] ^ d[42] ^ d[41] ^ d[39] ^ d[35] ^ d[32] ^ d[30] ^ d[29] ^ d[28] ^ d[26] ^ d[24] ^ d[23] ^ d[21] ^ d[20] ^ d[17] ^ d[16] ^ d[15] ^ d[13] ^ d[12] ^ d[9] ^ d[8] ^ d[4] ^ c[3] ^ c[4] ^ c[5] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[13] ^ c[14];
  newcrc[10] = d[63] ^ d[62] ^ d[60] ^ d[59] ^ d[58] ^ d[57] ^ d[56] ^ d[54] ^ d[53] ^ d[52] ^ d[47] ^ d[45] ^ d[43] ^ d[42] ^ d[40] ^ d[36] ^ d[33] ^ d[31] ^ d[30] ^ d[29] ^ d[27] ^ d[25] ^ d[24] ^ d[22] ^ d[21] ^ d[18] ^ d[17] ^ d[16] ^ d[14] ^ d[13] ^ d[10] ^ d[9] ^ d[5] ^ c[4] ^ c[5] ^ c[6] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[14] ^ c[15];
  newcrc[11] = d[63] ^ d[61] ^ d[60] ^ d[59] ^ d[58] ^ d[57] ^ d[55] ^ d[54] ^ d[53] ^ d[48] ^ d[46] ^ d[44] ^ d[43] ^ d[41] ^ d[37] ^ d[34] ^ d[32] ^ d[31] ^ d[30] ^ d[28] ^ d[26] ^ d[25] ^ d[23] ^ d[22] ^ d[19] ^ d[18] ^ d[17] ^ d[15] ^ d[14] ^ d[11] ^ d[10] ^ d[6] ^ c[0] ^ c[5] ^ c[6] ^ c[7] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[15];
  newcrc[12] = d[63] ^ d[62] ^ d[61] ^ d[60] ^ d[59] ^ d[54] ^ d[52] ^ d[51] ^ d[48] ^ d[47] ^ d[45] ^ d[44] ^ d[38] ^ d[31] ^ d[29] ^ d[28] ^ d[24] ^ d[23] ^ d[22] ^ d[18] ^ d[16] ^ d[15] ^ d[8] ^ d[7] ^ d[4] ^ d[0] ^ c[0] ^ c[3] ^ c[4] ^ c[6] ^ c[11] ^ c[12] ^ c[13] ^ c[14] ^ c[15];
  newcrc[13] = d[63] ^ d[62] ^ d[61] ^ d[60] ^ d[55] ^ d[53] ^ d[52] ^ d[49] ^ d[48] ^ d[46] ^ d[45] ^ d[39] ^ d[32] ^ d[30] ^ d[29] ^ d[25] ^ d[24] ^ d[23] ^ d[19] ^ d[17] ^ d[16] ^ d[9] ^ d[8] ^ d[5] ^ d[1] ^ c[0] ^ c[1] ^ c[4] ^ c[5] ^ c[7] ^ c[12] ^ c[13] ^ c[14] ^ c[15];
  newcrc[14] = d[63] ^ d[62] ^ d[61] ^ d[56] ^ d[54] ^ d[53] ^ d[50] ^ d[49] ^ d[47] ^ d[46] ^ d[40] ^ d[33] ^ d[31] ^ d[30] ^ d[26] ^ d[25] ^ d[24] ^ d[20] ^ d[18] ^ d[17] ^ d[10] ^ d[9] ^ d[6] ^ d[2] ^ c[1] ^ c[2] ^ c[5] ^ c[6] ^ c[8] ^ c[13] ^ c[14] ^ c[15];
  newcrc[15] = d[63] ^ d[62] ^ d[57] ^ d[55] ^ d[54] ^ d[51] ^ d[50] ^ d[48] ^ d[47] ^ d[41] ^ d[34] ^ d[32] ^ d[31] ^ d[27] ^ d[26] ^ d[25] ^ d[21] ^ d[19] ^ d[18] ^ d[11] ^ d[10] ^ d[7] ^ d[3] ^ c[0] ^ c[2] ^ c[3] ^ c[6] ^ c[7] ^ c[9] ^ c[14] ^ c[15];
  CRC16_D64 = newcrc;
end
endfunction

function [15:0] CRC16_D32;

  input [31:0] Data;
  input [15:0] crc;
  reg [31:0] d;
  reg [15:0] c;
  reg [15:0] newcrc;
begin
  d = Data;
  c = crc;

  newcrc[0] = d[28] ^ d[27] ^ d[26] ^ d[22] ^ d[20] ^ d[19] ^ d[12] ^ d[11] ^ d[8] ^ d[4] ^ d[0] ^ c[3] ^ c[4] ^ c[6] ^ c[10] ^ c[11] ^ c[12];
  newcrc[1] = d[29] ^ d[28] ^ d[27] ^ d[23] ^ d[21] ^ d[20] ^ d[13] ^ d[12] ^ d[9] ^ d[5] ^ d[1] ^ c[4] ^ c[5] ^ c[7] ^ c[11] ^ c[12] ^ c[13];
  newcrc[2] = d[30] ^ d[29] ^ d[28] ^ d[24] ^ d[22] ^ d[21] ^ d[14] ^ d[13] ^ d[10] ^ d[6] ^ d[2] ^ c[5] ^ c[6] ^ c[8] ^ c[12] ^ c[13] ^ c[14];
  newcrc[3] = d[31] ^ d[30] ^ d[29] ^ d[25] ^ d[23] ^ d[22] ^ d[15] ^ d[14] ^ d[11] ^ d[7] ^ d[3] ^ c[6] ^ c[7] ^ c[9] ^ c[13] ^ c[14] ^ c[15];
  newcrc[4] = d[31] ^ d[30] ^ d[26] ^ d[24] ^ d[23] ^ d[16] ^ d[15] ^ d[12] ^ d[8] ^ d[4] ^ c[0] ^ c[7] ^ c[8] ^ c[10] ^ c[14] ^ c[15];
  newcrc[5] = d[31] ^ d[28] ^ d[26] ^ d[25] ^ d[24] ^ d[22] ^ d[20] ^ d[19] ^ d[17] ^ d[16] ^ d[13] ^ d[12] ^ d[11] ^ d[9] ^ d[8] ^ d[5] ^ d[4] ^ d[0] ^ c[0] ^ c[1] ^ c[3] ^ c[4] ^ c[6] ^ c[8] ^ c[9] ^ c[10] ^ c[12] ^ c[15];
  newcrc[6] = d[29] ^ d[27] ^ d[26] ^ d[25] ^ d[23] ^ d[21] ^ d[20] ^ d[18] ^ d[17] ^ d[14] ^ d[13] ^ d[12] ^ d[10] ^ d[9] ^ d[6] ^ d[5] ^ d[1] ^ c[1] ^ c[2] ^ c[4] ^ c[5] ^ c[7] ^ c[9] ^ c[10] ^ c[11] ^ c[13];
  newcrc[7] = d[30] ^ d[28] ^ d[27] ^ d[26] ^ d[24] ^ d[22] ^ d[21] ^ d[19] ^ d[18] ^ d[15] ^ d[14] ^ d[13] ^ d[11] ^ d[10] ^ d[7] ^ d[6] ^ d[2] ^ c[2] ^ c[3] ^ c[5] ^ c[6] ^ c[8] ^ c[10] ^ c[11] ^ c[12] ^ c[14];
  newcrc[8] = d[31] ^ d[29] ^ d[28] ^ d[27] ^ d[25] ^ d[23] ^ d[22] ^ d[20] ^ d[19] ^ d[16] ^ d[15] ^ d[14] ^ d[12] ^ d[11] ^ d[8] ^ d[7] ^ d[3] ^ c[0] ^ c[3] ^ c[4] ^ c[6] ^ c[7] ^ c[9] ^ c[11] ^ c[12] ^ c[13] ^ c[15];
  newcrc[9] = d[30] ^ d[29] ^ d[28] ^ d[26] ^ d[24] ^ d[23] ^ d[21] ^ d[20] ^ d[17] ^ d[16] ^ d[15] ^ d[13] ^ d[12] ^ d[9] ^ d[8] ^ d[4] ^ c[0] ^ c[1] ^ c[4] ^ c[5] ^ c[7] ^ c[8] ^ c[10] ^ c[12] ^ c[13] ^ c[14];
  newcrc[10] = d[31] ^ d[30] ^ d[29] ^ d[27] ^ d[25] ^ d[24] ^ d[22] ^ d[21] ^ d[18] ^ d[17] ^ d[16] ^ d[14] ^ d[13] ^ d[10] ^ d[9] ^ d[5] ^ c[0] ^ c[1] ^ c[2] ^ c[5] ^ c[6] ^ c[8] ^ c[9] ^ c[11] ^ c[13] ^ c[14] ^ c[15];
  newcrc[11] = d[31] ^ d[30] ^ d[28] ^ d[26] ^ d[25] ^ d[23] ^ d[22] ^ d[19] ^ d[18] ^ d[17] ^ d[15] ^ d[14] ^ d[11] ^ d[10] ^ d[6] ^ c[1] ^ c[2] ^ c[3] ^ c[6] ^ c[7] ^ c[9] ^ c[10] ^ c[12] ^ c[14] ^ c[15];
  newcrc[12] = d[31] ^ d[29] ^ d[28] ^ d[24] ^ d[23] ^ d[22] ^ d[18] ^ d[16] ^ d[15] ^ d[8] ^ d[7] ^ d[4] ^ d[0] ^ c[0] ^ c[2] ^ c[6] ^ c[7] ^ c[8] ^ c[12] ^ c[13] ^ c[15];
  newcrc[13] = d[30] ^ d[29] ^ d[25] ^ d[24] ^ d[23] ^ d[19] ^ d[17] ^ d[16] ^ d[9] ^ d[8] ^ d[5] ^ d[1] ^ c[0] ^ c[1] ^ c[3] ^ c[7] ^ c[8] ^ c[9] ^ c[13] ^ c[14];
  newcrc[14] = d[31] ^ d[30] ^ d[26] ^ d[25] ^ d[24] ^ d[20] ^ d[18] ^ d[17] ^ d[10] ^ d[9] ^ d[6] ^ d[2] ^ c[1] ^ c[2] ^ c[4] ^ c[8] ^ c[9] ^ c[10] ^ c[14] ^ c[15];
  newcrc[15] = d[31] ^ d[27] ^ d[26] ^ d[25] ^ d[21] ^ d[19] ^ d[18] ^ d[11] ^ d[10] ^ d[7] ^ d[3] ^ c[2] ^ c[3] ^ c[5] ^ c[9] ^ c[10] ^ c[11] ^ c[15];
  CRC16_D32 = newcrc;
end
endfunction


function [15:0] CRC16_D16;

  input [15:0] Data;
  input [15:0] crc;
  reg [15:0] d;
  reg [15:0] c;
  reg [15:0] newcrc;
begin
  d = Data;
  c = crc;

  newcrc[0] = d[12] ^ d[11] ^ d[8] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[8] ^ c[11] ^ c[12];
  newcrc[1] = d[13] ^ d[12] ^ d[9] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[9] ^ c[12] ^ c[13];
  newcrc[2] = d[14] ^ d[13] ^ d[10] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[10] ^ c[13] ^ c[14];
  newcrc[3] = d[15] ^ d[14] ^ d[11] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[11] ^ c[14] ^ c[15];
  newcrc[4] = d[15] ^ d[12] ^ d[8] ^ d[4] ^ c[4] ^ c[8] ^ c[12] ^ c[15];
  newcrc[5] = d[13] ^ d[12] ^ d[11] ^ d[9] ^ d[8] ^ d[5] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[5] ^ c[8] ^ c[9] ^ c[11] ^ c[12] ^ c[13];
  newcrc[6] = d[14] ^ d[13] ^ d[12] ^ d[10] ^ d[9] ^ d[6] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[6] ^ c[9] ^ c[10] ^ c[12] ^ c[13] ^ c[14];
  newcrc[7] = d[15] ^ d[14] ^ d[13] ^ d[11] ^ d[10] ^ d[7] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[7] ^ c[10] ^ c[11] ^ c[13] ^ c[14] ^ c[15];
  newcrc[8] = d[15] ^ d[14] ^ d[12] ^ d[11] ^ d[8] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[8] ^ c[11] ^ c[12] ^ c[14] ^ c[15];
  newcrc[9] = d[15] ^ d[13] ^ d[12] ^ d[9] ^ d[8] ^ d[4] ^ c[4] ^ c[8] ^ c[9] ^ c[12] ^ c[13] ^ c[15];
  newcrc[10] = d[14] ^ d[13] ^ d[10] ^ d[9] ^ d[5] ^ c[5] ^ c[9] ^ c[10] ^ c[13] ^ c[14];
  newcrc[11] = d[15] ^ d[14] ^ d[11] ^ d[10] ^ d[6] ^ c[6] ^ c[10] ^ c[11] ^ c[14] ^ c[15];
  newcrc[12] = d[15] ^ d[8] ^ d[7] ^ d[4] ^ d[0] ^ c[0] ^ c[4] ^ c[7] ^ c[8] ^ c[15];
  newcrc[13] = d[9] ^ d[8] ^ d[5] ^ d[1] ^ c[1] ^ c[5] ^ c[8] ^ c[9];
  newcrc[14] = d[10] ^ d[9] ^ d[6] ^ d[2] ^ c[2] ^ c[6] ^ c[9] ^ c[10];
  newcrc[15] = d[11] ^ d[10] ^ d[7] ^ d[3] ^ c[3] ^ c[7] ^ c[10] ^ c[11];
  CRC16_D16 = newcrc;
end
endfunction

function [15:0] CRC16_D8;

  input [7:0] Data;
  input [15:0] crc;
  reg [7:0] d;
  reg [15:0] c;
  reg [15:0] newcrc;
begin
  d = Data;
  c = crc;

  newcrc[0] = d[4] ^ d[0] ^ c[8] ^ c[12];
  newcrc[1] = d[5] ^ d[1] ^ c[9] ^ c[13];
  newcrc[2] = d[6] ^ d[2] ^ c[10] ^ c[14];
  newcrc[3] = d[7] ^ d[3] ^ c[11] ^ c[15];
  newcrc[4] = d[4] ^ c[12];
  newcrc[5] = d[5] ^ d[4] ^ d[0] ^ c[8] ^ c[12] ^ c[13];
  newcrc[6] = d[6] ^ d[5] ^ d[1] ^ c[9] ^ c[13] ^ c[14];
  newcrc[7] = d[7] ^ d[6] ^ d[2] ^ c[10] ^ c[14] ^ c[15];
  newcrc[8] = d[7] ^ d[3] ^ c[0] ^ c[11] ^ c[15];
  newcrc[9] = d[4] ^ c[1] ^ c[12];
  newcrc[10] = d[5] ^ c[2] ^ c[13];
  newcrc[11] = d[6] ^ c[3] ^ c[14];
  newcrc[12] = d[7] ^ d[4] ^ d[0] ^ c[4] ^ c[8] ^ c[12] ^ c[15];
  newcrc[13] = d[5] ^ d[1] ^ c[5] ^ c[9] ^ c[13];
  newcrc[14] = d[6] ^ d[2] ^ c[6] ^ c[10] ^ c[14];
  newcrc[15] = d[7] ^ d[3] ^ c[7] ^ c[11] ^ c[15];
  CRC16_D8 = newcrc;
end
endfunction

endmodule             